﻿using System.Windows;
using CPN.PJN.Silverlight.Module.Shell.ViewParts;
using Microsoft.Practices.Prism.Modularity;
using Microsoft.Practices.Prism.Regions;
using Microsoft.Practices.Unity;

namespace CPN.PJN.Silverlight.Module.Shell
{
    /// <summary>
    /// Cette classe représente le Module de gestion du Shell
    /// </summary>
    public class ShellModule : IModule
    {
        #region Private Members

        /// <summary>
        /// Container Unity pour instanciation des type d'objet
        /// </summary>
        private readonly IUnityContainer container;

        /// <summary>
        /// Registre des vues à afficher
        /// </summary>
        private readonly IRegionViewRegistry regionViewRegistry;

        /// <summary>
        /// Manager de Region d'affichage
        /// </summary>
        private readonly IRegionManager regionManager;

        #endregion
                
        #region Constructor

        /// <summary>
        /// Constructeur par défaut
        /// </summary>
        /// <param name="container">Container Unity pour instanciation des type d'objet</param>
        /// <param name="regionViewRegistry">Registre des vues à afficher</param>
        /// <param name="regionManager">Manager de Region d'affichage</param>
        public ShellModule(IUnityContainer container, IRegionViewRegistry regionViewRegistry, IRegionManager regionManager)
        {
            this.container = container;
            this.regionViewRegistry = regionViewRegistry;
            this.regionManager = regionManager;
        }

        #endregion
        
        #region Initialize Method

        /// <summary>
        /// Cette méthode permet d'intialiser le Module
        /// </summary>
        public void Initialize()
        {
            this.RegisterTypesAndServices();

            this.InitializeShell();
        }
             
        #endregion

        #region InitializeShell Method

        /// <summary>
        /// Cette méthode permet d'afficher le Shell sur le RootVisual
        /// </summary>
        public void InitializeShell()
        {
            Application.Current.RootVisual = this.container.Resolve<IShellViewModel>().View as UIElement;
        } 

        #endregion

        #region RegisterTypesAndServices Method

        /// <summary>
        /// Enregistrement des type et des services
        /// </summary>
        private void RegisterTypesAndServices()
        {
            this.container.RegisterType<IShellViewModel, ShellViewModel>(new ContainerControlledLifetimeManager());
            this.container.RegisterType<IShellView, ShellView>(new ContainerControlledLifetimeManager());
        }

        #endregion
    }
}
